//
//  MaxProfitEasy.swift
//  LeetCodeSummary
//
//  Created by WangYonghe on 2020/7/10.
//  Copyright © 2020 WangYonghe. All rights reserved.
//  121. 买卖股票的最佳时机

import UIKit

/*
 121. 买卖股票的最佳时机
 给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。

 如果你最多只允许完成一笔交易（即买入和卖出一支股票一次），设计一个算法来计算你所能获取的最大利润。

 注意：你不能在买入股票前卖出股票。

  

 示例 1:

 输入: [7,1,5,3,6,4]
 输出: 5
 解释: 在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = 6-1 = 5 。
      注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格；同时，你不能在买入前卖出股票。
 示例 2:

 输入: [7,6,4,3,1]
 输出: 0
 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
 */

class MaxProfitEasy: NSObject {
    //方法一 暴力解法 非常耗时
    func maxProfit1(_ prices: [Int]) -> Int {
        var maxValue = 0
        for buyPoint in 0 ..< prices.count{
            for sellPoint in buyPoint + 1 ..< prices.count{
                let profit = prices[sellPoint] - prices[buyPoint]
                if profit > maxValue{
                    maxValue = profit
                }
            }
        }
        return maxValue
    }
    
    
    
    /*
     我们来假设自己来购买股票。随着时间的推移，每天我们都可以选择出售股票与否。那么，假设在第 i 天，如果我们要在今天卖股票，那么我们能赚多少钱呢？

     显然，如果我们真的在买卖股票，我们肯定会想：如果我是在历史最低点买的股票就好了！太好了，在题目中，我们只要用一个变量记录一个历史最低价格 minprice，我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。

     因此，我们只需要遍历价格数组一遍，记录历史最低点，然后在每一天考虑这么一个问题：
     
     >>>>>>>>如果我是在历史最低点买进的，那么我今天卖出能赚多少钱？当考虑完所有天数之时，我们就得到了最好的答案。


     */
    //方法二 一次遍历 LeetCode提交耗时40ms
    func maxProfit2(_ prices: [Int]) -> Int {

        //利润
        var maxValue = 0
        //历史最低点
        var lowPrice = Int(INT32_MAX)
        
        for i in 0 ..< prices.count{
            if lowPrice > prices[i] {
                //重置最低买点
                lowPrice = prices[i]
            }else if (prices[i] - lowPrice > maxValue){
                //利润
                maxValue = prices[i] - lowPrice
            }
        }
        
        return maxValue
        
    }
}
